package com.hmdp.utils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.hmdp.dto.UserDTO;
import com.hmdp.entity.User;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import static com.hmdp.utils.RedisConstants.CACHE_SHOP_TTL;

// 这个是我们的拦截器
public class LoginInterceptor implements HandlerInterceptor {
//    LoginInterceptor 因为这个类是我们手动创建的没有写注解所以我们要自己引入

    /*private StringRedisTemplate stringRedisTemplate;

    public LoginInterceptor(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }*/

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /*//  1.获取session
//        HttpSession session = request.getSession();

        // TODO 1.获取token(在请求头中)
        String token = request.getHeader("authorization");
//        也是使用我们的工具类来判断我们的token是否为空
        if (StrUtil.isBlank(token)) {
            // 表示为空
            // 这个就是失败
            response.setStatus(401); // 这个就是没有授权的意思
            return false;
        }

//        // 2.获取session中的用户
//        Object user = session.getAttribute("user");
//        TODO 2.基于我们的token来获取redis中的用户
//        entries方法就可以得到我们的所有就是里面的值
        Map<Object, Object> usermap = stringRedisTemplate.opsForHash().entries(RedisConstants.LOGIN_USER_KEY + token);

        // 3.判断用户是否存在 为空的话
        if (usermap.isEmpty()) {
            // 4.不存在 进行拦截
            response.setStatus(401); // 这个就是没有授权的意思
            return false;
        }

        // TODO 5. 将我们查询到的hash数据要转为我们的userDTO的对象
//         这个也要使用我们的工具    false 表示转换过程中如果有错误就报错就行
        UserDTO userDTO = BeanUtil.fillBeanWithMap(usermap, new UserDTO(), false);

        // 6.存在 保存在TreadLocal中去
//         那么这里就要进行修改 因为我当时存进去的就是userDto的对象
        UserHolder.saveUser(userDTO);

        // TODO 7.刷新token的有效期
        stringRedisTemplate.expire(RedisConstants.LOGIN_USER_KEY + token, CACHE_SHOP_TTL, TimeUnit.MINUTES);
*/

        // 由于这个是我们的第二个拦截器 所以我们第一个拦截器如果有人登录的话
        // 就会记录在我们的UserHolder里面
        if(UserHolder.getUser() == null){
            // 表示没有登录  有些页面你就不能访问
            response.setStatus(401);

            // 这个就表示不通行
            return false;
        }

        // 8.否则的话就放行
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

        // 移除用户
        UserHolder.removeUser();
    }
}
